gboolean ret = FALSE;
GVariant *dirmeta = NULL;
GVariant *packed = NULL;
+ GVariant *xattrs = NULL;
GChecksum *ret_checksum = NULL;
- if (!ostree_get_directory_metadata (f, f_info, &dirmeta, cancellable, error))
+ xattrs = ostree_get_xattrs_for_file (f, error);
+ if (!xattrs)
goto out;
+
+ dirmeta = ostree_create_directory_metadata (f_info, xattrs);
packed = ostree_wrap_metadata_variant (OSTREE_SERIALIZED_DIRMETA_VARIANT, dirmeta);
ret_checksum = g_checksum_new (G_CHECKSUM_SHA256);
g_checksum_update (ret_checksum, g_variant_get_data (packed),
ot_clear_checksum (&ret_checksum);
ot_clear_gvariant (&dirmeta);
ot_clear_gvariant (&packed);
+ ot_clear_gvariant (&xattrs);
return ret;
}
return TRUE;
}
-gboolean
-ostree_get_directory_metadata (GFile *dir,
- GFileInfo *dir_info,
- GVariant **out_metadata,
- GCancellable *cancellable,
- GError **error)
+GVariant *
+ostree_create_directory_metadata (GFileInfo *dir_info,
+ GVariant *xattrs)
{
- gboolean ret = FALSE;
- GVariant *xattrs = NULL;
GVariant *ret_metadata = NULL;
- xattrs = ostree_get_xattrs_for_file (dir, error);
- if (!xattrs)
- goto out;
-
ret_metadata = g_variant_new ("(uuuu@a(ayay))",
OSTREE_DIR_META_VERSION,
GUINT32_TO_BE (g_file_info_get_attribute_uint32 (dir_info, "unix::uid")),
xattrs);
g_variant_ref_sink (ret_metadata);
- ret = TRUE;
- *out_metadata = ret_metadata;
- ret_metadata = NULL;
- out:
- ot_clear_gvariant (&ret_metadata);
- ot_clear_gvariant (&xattrs);
- return ret;
+ return ret_metadata;
}
gboolean
}
static gboolean
-import_directory_meta (OstreeRepo *self,
- GFile *f,
- GVariant **out_variant,
- GChecksum **out_checksum,
+import_directory_meta (OstreeRepo *self,
+ GFileInfo *file_info,
+ GVariant *xattrs,
+ GChecksum **out_checksum,
GCancellable *cancellable,
- GError **error)
+ GError **error)
{
gboolean ret = FALSE;
GChecksum *ret_checksum = NULL;
GVariant *dirmeta = NULL;
- GFileInfo *f_info = NULL;
- f_info = g_file_query_info (f, OSTREE_GIO_FAST_QUERYINFO,
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
- cancellable, error);
- if (!f_info)
- goto out;
-
- if (!ostree_get_directory_metadata (f, f_info, &dirmeta, cancellable, error))
- goto out;
+ dirmeta = ostree_create_directory_metadata (file_info, xattrs);
if (!import_gvariant_object (self, OSTREE_SERIALIZED_DIRMETA_VARIANT,
dirmeta, &ret_checksum, cancellable, error))
goto out;
ret = TRUE;
- if (out_variant)
- {
- *out_variant = dirmeta;
- dirmeta = NULL;
- }
if (out_checksum)
{
*out_checksum = ret_checksum;
ret_checksum = NULL;
}
out:
- g_clear_object (&f_info);
ot_clear_checksum (&ret_checksum);
ot_clear_gvariant (&dirmeta);
return ret;
GHashTableIter hash_iter;
GSList *sorted_filenames = NULL;
GSList *iter;
+ GVariant *dir_xattrs = NULL;
GVariant *serialized_tree = NULL;
gpointer key, value;
- if (!import_directory_meta (self, dir, NULL, &ret_metadata_checksum, cancellable, error))
+ child_info = g_file_query_info (dir, OSTREE_GIO_FAST_QUERYINFO,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ cancellable, error);
+ if (!child_info)
goto out;
+ dir_xattrs = ostree_get_xattrs_for_file (dir, error);
+ if (!dir_xattrs)
+ goto out;
+
+ if (!import_directory_meta (self, child_info, dir_xattrs, &ret_metadata_checksum, cancellable, error))
+ goto out;
+
+ g_clear_object (&child_info);
+
dir_enum = g_file_enumerate_children ((GFile*)dir, OSTREE_GIO_FAST_QUERYINFO,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable,